<?php

/* Controller do Bolao para Usuários */

class BolaoController extends Zend_Controller_Action {

    private $_participantes = null;

    public function init() {
        /* Initialize action controller here */
        $this->_participantes = new Application_Model_GerenciadorParticipantesBolao();
    }

    public function indexAction() {
    }

    public function criarAction() {
        //Certificando-se que usuário está devidamente logado e pegando seu email.
        $emailCriador = $this->_helper->logOn(true)->getEmail();

        //mappers necessarios para esta acao:
        $bolaoMapper = new Application_Model_BolaoMapper();
        $campeonatoMapper = new Application_Model_CampeonatoMapper();
        $jogoMapper = new Application_Model_JogoMapper();
        $participantesMapper = new Application_Model_ParticipantesBolaoMapper();
        $usuarioMapper = new Application_Model_UsuarioMapper();

        $formulario = new Application_Form_CriarBolao($campeonatoMapper, $jogoMapper);

        $request = $this->getRequest();

        if($request->isPost()) {

            $post = $request->getPost();
            //estranho, precisa chamar o isValid($post) 2x para receber true...
            $formulario->isValid($post);

            if ($formulario->isValid($post)) {

                //verificando se nome do bolao ja existe:
                $nomeBolao = $formulario->getValue('nomeBolao');

                //O metodo nomeJaExiste retorna 0 se ainda nao ha bolao com
                //o nome informado pelo user:

                if($bolaoMapper->nomeJaExiste($nomeBolao, $emailCriador) != 0) {
                    //Erro: jogo ja cadastrado;
                    $this->view->erroNomeBolao = true;
                } else {

                    if($formulario->validarCampoEmail() == false) {
                        //Erro: inserção  inválida no campo de e-mails:
                        $this->view->erroNomeAmigos = true;
                    } else {
                        //Ok, jogo ainda nao cadastrado, prosseguindo
                        //com inserção no BD.
                        $bolao = new Application_Model_Bolao(
                                null,//Id do bolao (auto increment no BD)
                                $formulario->getValue('jogo'), //Id do Jogo
                                $nomeBolao,
                                $emailCriador,
                                0 //O bolao nao e importante, ja que é de user.
                        );
                        //interface entre o BD e a aplicação
                        $tabelaBolao = new Application_Model_BolaoMapper();
                        $tabelaBolao->salvar($bolao);

                        //
                        //bolao já foi salvo, agora verificar usuários:
                        //

                        $idBolao = $bolaoMapper->buscaIdBolaoPorNome($nomeBolao, $emailCriador);
                        $nomeCriador = $usuarioMapper->getNomePorEmail($emailCriador);

                        //primeiro inserimos o proprio criador como participante do bolao:
                        if(!$participantesMapper->existe($idBolao, $emailCriador))
                            $participantesMapper->insereParticipante($idBolao, $emailCriador);

                        //Separamos a lista de e-mails que o usuario entrou em usuarios cadastrados
                        //e não cadastrados:

                        $listaEmails = $formulario->getListaEmails();
                        $listaUsuariosCadastrados = $usuarioMapper
                                ->getListaUsuariosExistentes($listaEmails);
                        $listaUsuariosNaoCadastrados = $usuarioMapper
                                ->getListaUsuariosInexistentes($listaEmails);

                        //agora inserimos os participantes que ja possuem cadastro:
                        foreach($listaUsuariosCadastrados as $emailConvidado) {
                            //usuarios cadastrados no sistema serão inseridos entre os participantes,
                            //caso já não o sejam.
                            if(!$participantesMapper->existe($idBolao, $emailConvidado))
                                $participantesMapper->insereParticipante($idBolao, $emailConvidado);

                            $nomeConvidado = $usuarioMapper->getNomePorEmail($emailConvidado);

                            $this->emailNotificacaoConvite($nomeCriador, $nomeConvidado,
                                    $emailConvidado, $nomeBolao);
                        }

                        //finalmente vamos inserir os participante que ainda nao possuem cadastro:
                        foreach($listaUsuariosNaoCadastrados as $emailConvidado) {
                            //registrando usuarios e enviando convites para confirmarem cadastro:
                            Application_Model_Usuario::requisitarCadastroDeConvite(
                                    $emailConvidado, $nomeCriador, $nomeBolao);

                            if(!$participantesMapper->existe($idBolao, $emailConvidado))
                                $participantesMapper->insereParticipante($idBolao, $emailConvidado);
                        }

                        $this->view->criarBolaoConcluido = true;

                        $this->initView();
                    }//fim if4

                }//fim if3

            }//fim if2

        }//fim if

        $this->view->form = $formulario;

    }//fim criarAction


    public function convidarAction() {
        //Certificando-se que usuário está devidamente logado e pegando seu email.
        $emailCriador = $this->_helper->logOn(true)->getEmail();

        $bolaoMapper = new Application_Model_BolaoMapper();
        $jogoMapper = new Application_Model_JogoMapper();
        $usuarioMapper = new Application_Model_UsuarioMapper();
        $participantesMapper = new Application_Model_ParticipantesBolaoMapper();

        $formulario = new Application_Form_ConvidarBolao($bolaoMapper, $jogoMapper,
                $this->_IdUltimoBolaoCriado, $emailCriador);

        $this->view->form = $formulario;

        $request = $this->getRequest();

        if($request->isPost()) {

            $post = $request->getPost();

            //Entrada de valores ok:
            if ($formulario->isValid($post)) {

                $idBolao = $formulario->getValue('nomeBolao');

                $nomeCriador = $usuarioMapper->getNomePorEmail($emailCriador);

                $nomeBolao = $bolaoMapper->findBolao($idBolao)->get_nome();

                //primeiro inserimos o proprio criador como participante do bolao:
                if(!$participantesMapper->existe($idBolao, $emailCriador))
                    $participantesMapper->insereParticipante($idBolao, $emailCriador);

                $listaEmails = $formulario->getListaEmails();
                $listaUsuariosCadastrados = $usuarioMapper->getListaUsuariosExistentes($listaEmails);
                $listaUsuariosNaoCadastrados = $usuarioMapper->getListaUsuariosInexistentes($listaEmails);

                //agora inserimos os participantes que ja possuem cadastro:
                foreach($listaUsuariosCadastrados as $emailConvidado) {
                    //usuarios cadastrados no sistema serão inseridos entre os participantes,
                    //caso já não o sejam.
                    if(!$participantesMapper->existe($idBolao, $emailConvidado))
                        $participantesMapper->insereParticipante($idBolao, $emailConvidado);

                    $nomeConvidado = $usuarioMapper->getNomePorEmail($emailConvidado);

                    $this->emailNotificacaoConvite($nomeCriador, $nomeConvidado,
                            $emailConvidado, $nomeBolao);
                }

                //finalmente vamos inserir os participante que ainda nao possuem cadastro:
                foreach($listaUsuariosNaoCadastrados as $emailConvidado) {
                    //registrando usuarios e enviando convites para confirmarem cadastro:
                    Application_Model_Usuario::requisitarCadastroDeConvite($emailConvidado, $nomeCriador, $nomeBolao);

                    if(!$participantesMapper->existe($idBolao, $emailConvidado))
                        $participantesMapper->insereParticipante($idBolao, $emailConvidado);
                }

                $this->view->sucesso = true;

            } else { //Algum valor de entrada incorreto:
                $this->view->sucesso = false;
            }//fim if2


        }//fim if1
        $this->initView();
    }//fim convidar


    public function recusarAction() {
        $request = $this->getRequest();
        $id_bolao = $request->getParam('id_bolao');
        $mapper = new Application_Model_ParticipantesBolaoMapper();

        $this->view->mensagem = 'Você não está participando deste bolão ou já fez sua aposta.';

        if ($id_bolao != null) {
            $usuario = $this->_helper->logOn(true);
            $resultado = $mapper->remove($id_bolao, $usuario->getEmail());
            if ($resultado > 0) {
                $this->view->mensagem = 'Parabéns, você não participa mais deste bolão';
            }
        }
    }

    public function detalhesAction()
    {
        $apostaMapper = new Application_Model_ApostaMapper();
        $bolaoMapper = new Application_Model_BolaoMapper();
        $campeonatoMapper = new Application_Model_CampeonatoMapper();
        $jogoMapper = new Application_Model_JogoMapper();
        $vencedores = new Application_Model_PagamentoAposta();


        $apostador = $this->_helper->logOn(false);

        $request = $this->getRequest();
        $id_bolao = $this->getRequest()->getParam('id_bolao');
        $this->view->dados = NULL;

        //verificacao da existencia de bolao
        $bolao = $bolaoMapper->findBolao($id_bolao);
        if($bolao == NULL) {
            $this->view->dados = 'Bolão Inexistente! Não foi possível exibir os dados.';
            $this->view->existe = NULL;
            return;
        }

        $id_jogo = $bolaoMapper->findBolao($id_bolao)->get_id_jogo();
        $jogo = $jogoMapper->fetch_sem_data($id_jogo);

        if($apostador != NULL){
            $apostou = $apostaMapper->localizarApostadorBolao($apostador->getEmail(), NULL, $bolao->get_id());

            if($apostou != NULL)
            {
                $ta = $apostou->getGolsTimeA();
                $tb = $apostou->getGolsTimeB();

                $palpite = $jogo->getTimeA()." ".$ta." X ".$tb." ".$jogo->getTimeB();
                $this->view->palpite = $palpite;
            }
        }
        else{
            $apostou = NULL;
        }
        if ($apostou != NULL){
            $this->view->apostou = true;
        }
        else {
            $this->view->apostou = false;
        }

        

        $nome_campeonato = $campeonatoMapper->localizar($jogo->getCampeonatoId())->getNome();

        $nome_bolao = $bolao->get_nome();
        if($nome_bolao == NULL)
        {
            $nome_bolao = 'Bolão #'.$bolao->get_id();
        }
        
        $ja_passou = $jogo->getGolsTimeA();

        if($ja_passou != NULL)
        {
            $this->view->vencedores = $vencedores->getVencedores($id_bolao, $jogo);
        }
        else {
            $this->view->vencedores = $vencedores->getApostadores($id_bolao, $id_jogo);;
        }

        $this->view->nomebolao = $nome_bolao;
        $this->view->id_bolao = $bolao->get_id();
        $criador = $bolao->get_email_criador();

        if($criador == NULL){
            $criador = 'administrador';
        }        

        $this->view->criador = $criador;
        $this->view->data = $jogo->getData();
        $this->view->campeonato = $nome_campeonato;
        $this->view->time_a = $jogo->getTimeA();
        $this->view->time_b = $jogo->getTimeB();
        $this->view->gols_a = $jogo->getGolsTimeA();
        $this->view->gols_b = $jogo->getGolsTimeB();

        //verificacao de data limite
        $this->view->passou = $jogo->jaPassou();

        $this->view->nro_apostas = $apostaMapper->apostasEmBolao($id_bolao);
    }

    public function pendentesAction() {
        $this->_helper->logOn(true)->getEmail();

        $request = $this->getRequest();
        $inicio = $this->getRequest()->getParam('inicio', 0);
        $quantidade = $this->getRequest()->getParam('quantidade', 10);

        $email = Zend_Auth::getInstance()->getIdentity();
        $this->view->usuarioVerificado = $this->checagemUsuario();
        $this->view->total = $this->_participantes->getTotalBoloesPendentes($email);
        $this->view->inicio = $inicio;
        $this->view->quantidade = $quantidade;
        $this->view->boloesPendentes = $this->recuperarBoloes($inicio, $quantidade);
    }

    public function emDestaqueAction() {
        $request = $this->getRequest();
        $inicio = $this->getRequest()->getParam('inicio', 0);
        $quantidade = $this->getRequest()->getParam('quantidade', 10);

        $this->view->usuarioVerificado = $this->checagemUsuario();
        $this->view->total = $this->_participantes->getTotalJogosImportantes();

        $this->view->inicio = $inicio;
        $this->view->quantidade = $quantidade;
        $this->view->boloesEmDestaque = $this->recuperaBoloesImportantes($inicio, $quantidade);
    }

    public function maisApostadosAction() {
        $request = $this->getRequest();
        $inicio = $this->getRequest()->getParam('inicio', 0);
        $quantidade = $this->getRequest()->getParam('quantidade', 10);

        $this->view->usuarioVerificado = $this->checagemUsuario();
        $this->view->total = $this->_participantes->getTotalJogosMaisApostados();
        $this->view->inicio = $inicio;
        $this->view->quantidade = $quantidade;
        $this->view->boloesMaisApostados = $this->recuperaBoloesMaisApostados($inicio, $quantidade);
    }

    public function recuperarBoloes($inicio, $quantidade) {
        $pendentes = null;

        if (Zend_Auth::getInstance()->hasIdentity()) {
            $email = Zend_Auth::getInstance()->getIdentity();
            $pendentes = $this->_participantes->jogosPendentes($email, $inicio, $quantidade);
        }

        return $pendentes;
    }

    public function recuperaBoloesImportantes($inicio, $quantidade) {
        $jogos = $this->_participantes->jogosImportantes($inicio, $quantidade);

        return $jogos;
    }

    public function recuperaBoloesMaisApostados($inicio, $quantidade) {
        $jogos = $this->_participantes->jogosMaisApostados($inicio, $quantidade);

        //echo var_export($jogos);
        return $jogos;
    }

    public function emailNotificacaoConvite($nomeCriador, $nomeConvidado, $emailConvidado, $nomeBolao) {
        $texto = 'Olá '.$nomeConvidado.". \n".
                'Voce foi convidado a participar do bolao '.
                $nomeBolao.' criado por '.$nomeCriador.
                'Visite http://'.$_SERVER['SERVER_NAME'].' e faça a sua aposta!'.
                "\n\n".'Boa sorte!';

        $mail = new Zend_Mail();
        $mail->setBodyText($texto);
        $mail->setFrom('noreply', 'Boladona mail');
        $mail->addTo($emailConvidado, $nomeConvidado);
        $mail->setSubject('Convite  para um bolao no BOLADONA.COM');

        try {
            $sucesso = $mail->send();
        } catch (Exception $ex) {
            echo '<pre>'.$ex.'</pre>';
        }
    }

    public function meusBoloesAction() {
        $email = $this->_helper->logOn(true)->getEmail();
        $this->view->usuarioVerificado = $email;

        $novos = $this->getRequest()->getParam('passado', 0);
        
        $this->view->boloes = $this->recuperaBoloesUsuario($email, $novos);
    }

    public function recuperaBoloesUsuario($email, $novos) {
        $apostaMapper = new Application_Model_ApostaMapper();
        $bolaoMapper = new Application_Model_BolaoMapper();

        $apostas = $apostaMapper->usuarioApostas($email);
        $boloes = $bolaoMapper->dadosBolao($apostas, $novos);
        return $boloes;
    }

    public function checagemUsuario() {
        $logado = $this->_helper->logOn(false);
        if($logado == NULL) return;
        else return $logado->getEmail();
    }

    public function maisBoloesAction() {
        
        //$credencial = $this->_helper->logOn(true)->getEmail();
        
        $campeonatoMapper = new Application_Model_CampeonatoMapper();
        $jogoMapper = new Application_Model_JogoMapper();
        

        $request = $this->getRequest();
        $inicio = $this->getRequest()->getParam('inicio', 0);
        $quantidade = $this->getRequest()->getParam('quantidade', 10);
        $campeonato = $this->getRequest()->getParam('campeonato');

        $this->view->usuarioVerificado = $this->checagemUsuario();

        $formulario = new Application_Form_MaisBoloes($campeonatoMapper);

        if($campeonato == null || $campeonato == 'Todos')
        {
            
            $this->view->boloesCampeonato = $this->_participantes->jogosAdm($inicio, $quantidade);
            $this->view->total = $this->_participantes->getTotalBoloes();
            $this->view->nome = 'Todos';
            
        }
        else
        {
            $this->view->boloesCampeonato = $this->_participantes->jogosPorCampeonato($campeonato, $inicio, $quantidade);
            $this->view->total = $this->_participantes->getTotalBoloesCampeonato($campeonato);
            $formulario->setValor($campeonato);
            $this->view->nome = $campeonato;
            
        }        
        
        $this->view->inicio = $inicio;
        $this->view->quantidade = $quantidade;

        if($request->isPost())
        {
            $post = $request->getPost();

            $formulario = new Application_Form_MaisBoloes($campeonatoMapper);

            //Entrada de valores ok:
            if ($formulario->isValid($post)) {

                $campeonato = $formulario->getValue('campeonato');

                $inicio = 0;
                $quantidade = 10;

                $this->view->inicio = $inicio;
                $this->view->quantidade = $quantidade;

                $this->view->nome = $campeonato;

                if($campeonato == null)
                {

                    $this->view->boloesCampeonato = $this->_participantes->jogosAdm($inicio, $quantidade);
                    $this->view->total = $this->_participantes->getTotalBoloes();
                    $this->view->nome = 'Todos';

                }
                else
                {
                    $this->view->boloesCampeonato = $this->_participantes->jogosPorCampeonato($campeonato, $inicio, $quantidade);
                    $this->view->total = $this->_participantes->getTotalBoloesCampeonato($campeonato);                    
                }
            }
        }//fim if
        
        //$this->view->nome =  $formulario->getValue('s_campeonato');;

        $this->view->form = $formulario;

        
    }

}
